//顺序表方法下的针对通讯录具体的再细补充，大部分都要再细补充，干脆不改原来的顺序表，自己再做一个调用自己针对这边对应改的，顺序表那边是通用的保持那边的通用性，如果它那边针对自己这种情况的改就不通用了，要什么新的情况就调用通用的和对应补充

//每一个.c一个对象，就看它有没有包含头文件有声明向外找了
#include"my_SeqList.h"

//通讯录的初始化
void ContactInit(Contact* con)
{
	SLInit(con);
}

//通讯录的销毁
void ContactDestory(Contact* con)
{
	SLDestory(con);
}

//通讯录添加数据
void ContactAdd(Contact* con)
{
	
	//获取用户输入的内容：姓名+性别+年龄+电话+地址
	peoInfo info;//先单独收成一个外部元素的量后再直接元素的一键接
	printf("请输入要添加的联系人姓名:\n");
	scanf("%s", info.name);
	printf("请输入要添加的联系人性别:\n");
	scanf("%s", info.gender);
	printf("请输入要添加的联系人年龄\n");
	scanf("%d", &info.age);
	printf("请输入要添加的联系人电话\n");
	scanf("%s", info.tel);
	printf("请输入要添加的联系人地址\n");
	scanf("%s", info.addr);
	//往通讯录中添加联系人数据
	SLPushBack(con, info);
}

//查找联系人数据下标
int FindByName(Contact* con, char name[])
{
	for (int i = 0;i < con->size;i++)
	{
		if ((strcmp(con->arr[i].name, name)) == 0)
		{
			//找到了
			return i;
		}
	}
	//没有找到
	return -1;
}

//通讯录删除数据
void ContactDel(Contact* con)
{
	//要删除的数据必须要存在，才能执行删除操作
	//查找(用名字来查)
	char name[NAME_MAX];
	printf("请输入要删除的联系人姓名:\n");
	scanf("%s", name);
	int find = FindByName(con, name);
	if (find < 0)
	{
		printf("要删除的联系人数据不存在！\n");
		return;
	}
	//要删除的联系人数据存在——>知道了要删除的联系人数据对应的下标
	SLErase(con, find);
	printf("删除成功!\n");
}

//展示通讯录数据
void ContactShow(Contact* con)
{
	//表头：姓名 性别 年龄 电话 地址
	printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");
	//遍历通讯录，按照格式打印每个联系人数据
	for (int i = 0;i < con->size;i++)
	{
		printf("%3s %3s %3d %3s %3s\n",
			con->arr[i].name,
			con->arr[i].gender,
			con->arr[i].age,
			con->arr[i].tel,
			con->arr[i].addr
		);
	}
}

//通讯录的修改
void ContactModify(Contact* con)
{
	//要修改的联系人数据存在
	char name[NAME_MAX];
	printf("请输入要修改的用户姓名：\n");
	scanf("%s", name);
	int find = FindByName(con, name);
	if (find < 0)
	{
		printf("要修改的联系人数据不存在\n");
		return;
	}
	//直接修改
	printf("请输入新的姓名：\n");
	scanf("%s", con->arr[find].name);
	printf("请输入新的性别：\n");
	scanf("%s", con->arr[find].gender);
	printf("请输入新的年龄：\n");
	scanf("%d", &con->arr[find].age);
	printf("请输入新的电话：\n");
	scanf("%s", con->arr[find].tel);
	printf("请输入新的住址：\n");
	scanf("%s", con->arr[find].addr);
	printf("修改成功！\n");
}

//通讯录查找
void ContactFind(Contact* con)
{
	char name[NAME_MAX];
	printf("请输入要查找的联系人姓名\n");
	scanf("%s", name);

	int find = FindByName(con,name);
	if (find < 0)
	{
		printf("要查找的联系人数据不存在！\n");
		return;
	}
	printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");
	printf("%3s %3s %3d %3s %3s\n",
		con->arr[find].name,
		con->arr[find].gender,
		con->arr[find].age,
		con->arr[find].tel,
		con->arr[find].addr
	);

}

//通讯录文件读取
void LoadContact(Contact* con)
{
	FILE* pf = fopen("contact.txt", "rb");
	if (pf == NULL)
	{
		perror("fopen fail!\n");
		return;
	}
	//循环读取文件数据
	peoInfo info;//结构体数据没有标准的格式可以格式化输入
	while (fread(&info, sizeof(info), 1, pf))//一次读取一个结构体的量
	{
		SLPushBack(con, info);
	}
	printf("历史数据导入通讯录成功！\n");
	fclose(pf);
	pf = NULL;
}


//通讯录文件保存
void SaveContact(Contact* con)
{
	FILE* pf = fopen("contact.txt", "wb");
	if (pf == NULL)
	{
		perror("fopen fail!\n");
		return;
	}
	//将通讯录数据写到保持到文件
	for (int i = 0;i < con->size;i++)
	{//arr->角标0、第1个元素
		fwrite(con->arr + i, sizeof(peoInfo), 1, pf);
	}
	printf("通讯录数据保存成功！\n");
	fclose(pf);
	pf = NULL;
}